2019-03-26 | Docker | UNLOCK

Docker 简单入门-Dockderfile基础语法

还是话不多说,直接开始

我们先说说 Dockerfile的语法


1.每个Dockerfile必须以FROM指令开头,FROM指明了当前镜像创建的基镜像,也就是说每个镜像必须基于一个已存在的镜像进行创建。FROM指令后直接跟基镜像的名称或者镜像名称加标签。镜像的名称和标签可以去Docker Hub或者使用命令docker search keyword 进行搜索。

1
2
3
4
>案例:
> 1.FROM scratch 表示不指定具体镜像使用空镜像作为基础镜像。
> 2.FROM centos #使用centos做为基础镜像
> 3.FROM ubuntu:14.00 #指定具体版本

ps: 为了安全 应尽量使用官方 image 作为基础镜像


2.LABEL 关键字 标签? 看案例

1
2
3
>    1.LABEL maintainer=“purui@qq.com”
> 2.LABEL version="1.0.0"
> 3.LABEL description="描述"


3.RUN 关键字 运行命令 RUN命令有两种格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>    1.RUN yum update && yum install -y vim
> 2.RUN ["/bin/bash","-c","echo hello"]
```
<u>ps:注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.

多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

RUN书写时的换行符是\</u>


* * *

4.WORKDIR 关键字 可以设定当前的工作目录
> 1.WORKDIR /root #如果没有 root目录会自动创建

<u>ps:不推荐使用 RUN cd 推荐使用绝对目录</u>


* * *

5.ADD关键字 可以从宿主机copy 文件到image中,如果是压缩文件还会自动解压
> 1.ADD hello.sh / #copy hello.sh 到 根目录下
> 2.如果先使用 WORKDIR /root 指定目录,再运行 ADD hello.sh /test #会copy到 /root/test/下面

6.ENV 关键字 声明常量

语法有两种

  1. ENV
  2. ENV =
    3.ENV MYSQL_VERSION 5.6
    RUN apt-get install mysql-server=”${MYSQL_VERSION}”
    1
    2
    3
    7.CMD 命令为运行容器执行默认的命令,如果有多个命令那么它只执行最后一个

    语法有三种写法
  1. CMD [“executable”,”param1”,”param2”]
  2. CMD [“param1”,”param2”]
  3. CMD command param1 param2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    8.RUN & CMD

    >不要把RUN和CMD搞混了。
    >
    >RUN是构件容器时就运行的命令以及提交运行结果
    >
    >CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

    9.EXPOSE 可以暴露容器内部的应用端口 给宿主机访问

    10.ENTRYPOINT 功能是启动时的默认命令

    >与CMD比较说明(这俩命令太像了,而且还可以配合使用):
    >
    >1. 相同点:
    >
    >只能写一条,如果写了多条,那么只有最后一条生效
    >
    >容器启动时才运行,运行时机相同
    >
    >
    >
    >2. 不同点:
    >
    > ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
    >
    > 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
    > 如下:

FROM ubuntu
ENTRYPOINT [“top”, “-b”]
CMD [“-c”]

1
2
3
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

如下:

FROM ubuntu
ENTRYPOINT [“top”, “-b”]
CMD ls -al
`
那么将执行ls -al ,top -b不会执行。
这是docker 官方给出的 组合执行情况
ad2d70f43e9135378d13b9af5ad9beb8

#参考
https://www.cnblogs.com/dazhoushuoceshi/p/7066041.html

评论加载中